package com.google.gwt.sample.dynatablerf.server.business;

import com.google.gwt.sample.dynatablerf.server.dao.IDAOManager;
import com.google.gwt.sample.dynatablerf.server.dao.impl.ServicoQueryParams;
import com.google.gwt.sample.dynatablerf.server.domain.AbstractEntity;
import com.google.gwt.sample.dynatablerf.server.domain.AbstractEntityQueryParams;
import com.google.gwt.sample.dynatablerf.server.domain.Material;
import com.google.gwt.sample.dynatablerf.server.domain.MaterialProjeto;
import com.google.gwt.sample.dynatablerf.server.domain.MaterialProjetoQueryParams;
import com.google.gwt.sample.dynatablerf.server.domain.MaterialQueryParams;
import com.google.gwt.sample.dynatablerf.server.domain.ODI;
import com.google.gwt.sample.dynatablerf.server.domain.ODIQueryParams;
import com.google.gwt.sample.dynatablerf.server.domain.Projeto;
import com.google.gwt.sample.dynatablerf.server.domain.ProjetoQueryParams;
import com.google.gwt.sample.dynatablerf.server.domain.Servico;
import com.google.gwt.sample.dynatablerf.server.domain.ServicoProjeto;
import com.google.gwt.sample.dynatablerf.server.domain.ServicoProjetoQueryParams;
import com.google.gwt.sample.dynatablerf.server.domain.TipoInstalacao;
import com.google.gwt.sample.dynatablerf.server.domain.TipoInstalacaoQueryParams;
import com.google.gwt.sample.dynatablerf.server.domain.Usuario;
import com.google.gwt.sample.dynatablerf.server.domain.UsuarioQueryParams;
import com.google.gwt.sample.dynatablerf.server.util.BeanUtil;

public class ControladorFactory {

	private static final String DAO_ID = "dao";
	private static final String CONTROLADOR_ID = "controlador";

	private static Controlador<Projeto, ProjetoQueryParams> controladorProjeto;
	private static ControladorUsuario controladorUsuario;
	private static Controlador<TipoInstalacao, TipoInstalacaoQueryParams> controladorTipoInstalacao;
	private static Controlador<Material, MaterialQueryParams> controladorMaterial;
	private static Controlador<ODI, ODIQueryParams> controladorODI;
	private static Controlador<Servico, ServicoQueryParams> controladorServico;
	private static Controlador<MaterialProjeto, MaterialProjetoQueryParams> controladorMaterialProjeto;
	private static Controlador<ServicoProjeto, ServicoProjetoQueryParams> controladorServicoProjeto;

	private static <T extends AbstractEntity, G extends AbstractEntityQueryParams> Controlador<T, G> getControladorGeral(
			Class<T> clazz, Class<G> clazz2) {
		return getControlador(CONTROLADOR_ID, clazz, clazz2);
	}

	private static <T extends AbstractEntity, G extends AbstractEntityQueryParams> Controlador<T, G> getControlador(
			Class<T> clazz, Class<G> clazz2) {
		return getControlador(CONTROLADOR_ID + clazz.getSimpleName(), clazz,
				clazz2);
	}

	@SuppressWarnings("unchecked")
	private static <T extends AbstractEntity, G extends AbstractEntityQueryParams> Controlador<T, G> getControlador(
			String controladorId, Class<T> clazz, Class<G> clazz2) {
		Controlador<T, G> controlador = BeanUtil.getInstance(controladorId);
		controlador.setDaoManager((IDAOManager<T, G>) BeanUtil
				.getInstance(DAO_ID + clazz.getSimpleName()));
		return controlador;
	}

	public static ControladorUsuario getControladorUsuario() {
		if (controladorUsuario == null)
			controladorUsuario = (ControladorUsuario) getControlador(
					Usuario.class, UsuarioQueryParams.class);
		return controladorUsuario;
	}

	public static Controlador<TipoInstalacao, TipoInstalacaoQueryParams> getControladorTipoInstalacao() {
		if (controladorTipoInstalacao == null)
			controladorTipoInstalacao = getControladorGeral(
					TipoInstalacao.class, TipoInstalacaoQueryParams.class);
		return controladorTipoInstalacao;
	}

	public static Controlador<Projeto, ProjetoQueryParams> getControladorProjeto() {
		if (controladorProjeto == null)
			controladorProjeto = (Controlador<Projeto, ProjetoQueryParams>) getControladorGeral(
					Projeto.class, ProjetoQueryParams.class);
		return controladorProjeto;
	}

	public static Controlador<Material, MaterialQueryParams> getControladorMaterial() {
		if (controladorMaterial == null)
			controladorMaterial = getControladorGeral(Material.class,
					MaterialQueryParams.class);
		return controladorMaterial;
	}

	public static Controlador<ODI, ODIQueryParams> getControladorODI() {
		if (controladorODI == null)
			controladorODI = getControladorGeral(ODI.class,
					ODIQueryParams.class);
		return controladorODI;
	}

	public static Controlador<Servico, ServicoQueryParams> getControladorServico() {
		if (controladorServico == null)
			controladorServico = getControladorGeral(Servico.class,
					ServicoQueryParams.class);
		return controladorServico;
	}

	public static Controlador<MaterialProjeto, MaterialProjetoQueryParams> getControladorMaterialProjeto() {
		if (controladorMaterialProjeto == null)
			controladorMaterialProjeto = getControladorGeral(
					MaterialProjeto.class, MaterialProjetoQueryParams.class);
		return controladorMaterialProjeto;
	}

	public static Controlador<ServicoProjeto, ServicoProjetoQueryParams> getControladorServicoProjeto() {
		if (controladorServicoProjeto == null)
			controladorServicoProjeto = getControladorGeral(
					ServicoProjeto.class, ServicoProjetoQueryParams.class);
		return controladorServicoProjeto;
	}
}
